package com.AdvancedDemos.集合;

import java.util.*;

public class 集合的批量添加 {
    public static void main(String[] args) {
        //补充:集合的批量添加方法
        //JDK9版本开始可以使用
        //List : List.of(T... elements)
        List<Integer> integers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//List.of产生的list并不是ArrayList或者LinkedList,而是一个一个特殊的list实现类对象,它产生后:
        //1.不允许添加 2.不允许修改 3.不允许删除 4.只可以获取元素值
        //所以通常作为参数传递,来批量添加集合元素

        ArrayList<Integer> list = new ArrayList<>(integers);
        System.out.println(list);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


        //Set : Set.of(T... elements)
        //同样Set.of产生的set实现类对象不能添加,删除,修改,只能获取元素值,用作传递参数
        //此外Set接口不允许存储重复元素,所以of()中的数据不能重复,当数据是自定义类型时,默认比较的是地址,想要去重,需要在自定义类型中重写hashCode()和equals()
        HashSet<Integer> integers1 = new HashSet<>(Set.of(1, 3, 2, 5, 4));//[1, 2, 3, 4, 5]


        System.out.println(integers1);
        integers1.addAll(Set.of(6, 2, 1, 3, 5, 4));//再次向integers1中添加数据,但是因为HashSet是会自动去重的,所以只多了个6
        System.out.println(integers1);//[1, 2, 3, 4, 5, 6]


        //Map : Map.of(K k1,V v1, ... ,K k10,V v10) 最多10对数据
        //返回的map实现类对象,不能删除修改添加,只能获取元素值,用于传递数据
        //of()参数中,键不能重复 当键是自定义类时,想要去重,要重写自定义类的hashCode()和equals()
        Map<Integer, Integer> map = Map.of(1, 2, 3, 3);
        System.out.println(map);//{3=3, 1=2}
        HashMap<Integer, Integer> hashMap = new HashMap<>(map);
        System.out.println(hashMap);//{1=2, 3=3}
        hashMap.putAll(Map.of(1, 1, 2, 2));
        System.out.println(hashMap);//{1=1, 2=2, 3=3} map键不能重复,后加入的(1=1)覆盖了先加入的(1=2)


        //更常用的是变形方法:对称成对的数据封装,封装为Entry对象
        //封装数据使用的方法是Map的静态方法entry(K k,V v)
        Map.Entry<Integer, Integer> entry1 = Map.entry(1, 1);
        Map.Entry<Integer, Integer> entry2 = Map.entry(2, 2);
        Map.Entry<Integer, Integer> entry3 = Map.entry(3, 3);
        Map.Entry<Integer, Integer> entry4 = Map.entry(4, 4);
        //将Entry对象添加到批量存储方法中
        //Map.ofEntries(Entry对象...)
        Map<Integer, Integer> map1 = Map.ofEntries(entry1, entry2, entry3, entry4);
        System.out.println(map1);//{1=1, 4=4, 3=3, 2=2}
        //然后可以放到hashMap.putAll( )或是new HashMap<>( )中实现集合的批量添加
        HashMap<Integer, Integer> hashMap1 = new HashMap<>(map1);
        System.out.println(hashMap1);//{1=1, 2=2, 3=3, 4=4}

    }
}
